import os
from typing import List

import requests
from llama_index.core import Settings, SimpleDirectoryReader, VectorStoreIndex, get_response_synthesizer
from llama_index.core.agent import ReActAgent
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.tools import QueryEngineTool, ToolMetadata

from config.embeddings import embed_model_local_bge_small
from config.llm import deepseek_llm
from tool.chroma_tool import ChromaTool
from tool.file_tool import getRootPath
from tool.web_search import WebEngine

Settings.llm = deepseek_llm()
Settings.embed_model = embed_model_local_bge_small()

# chunk_size 文档块大小，chunk_overlap 文档块重叠度
Settings.node_parser = SentenceSplitter(chunk_size=500, chunk_overlap=100)
root_path = getRootPath()


# 创建工具集
def build_tools():
    # 工具1：本地知识库
    chroma_tool = ChromaTool(chroma_db_path=root_path + '/chroma_db', correction_name="chroma-examples")
    local_index = chroma_tool.getVectorStoreIndex()
    local_tool = QueryEngineTool(
        query_engine=local_index.as_query_engine(),
        metadata=ToolMetadata(
            name="local_knowledge",
            description="包含机构内部文档的知识库，适用于内部流程、产品规格等问题"
        )
    )

    # 工具2：网络搜索
    web_tool = QueryEngineTool(
        query_engine=WebEngine(),  # 自定义网络查询引擎
        metadata=ToolMetadata(
            name="web_search",
            description="访问实时互联网信息，适用于需要最新数据、新闻或外部知识的问题"
        )
    )

    return [local_tool, web_tool]


# 创建智能Agent
def create_agent():
    llm = deepseek_llm()

    return ReActAgent.from_tools(
        tools=build_tools(),
        llm=llm,
        system_prompt="""你是一个具备双重能力的智能助手，请根据问题类型选择工具：
        1. 当涉及内部流程、产品参数等已知信息时，使用local_tool
        2. 当需要实时数据、新闻或未知领域信息时，使用web_tool
        3. 始终用中文回复，并标注信息来源""",
        verbose=True # 是否输出中间过程
    )


# 使用示例
if __name__ == "__main__":
    agent = create_agent()

    # 测试本地知识查询
    print(agent.chat("退订费用是多少？"))

    # 测试网络搜索
    print(agent.chat("2023年诺贝尔奖得主有哪些？"))

    # 混合查询
    print(agent.chat("结合公司业务，分析AI发展方向"))
